文件:缓存系统
Laravel 提供了一個統一的快取接口,支援多種快取驅動,幫助提高應用程式的效能,當然也可以使用快取來儲存臨時的數據,從而減少資料庫查詢的次數和提高回應速度。
Laravel 支援多種快取驅動,包括 file, database, redis, memcached 等,在 .env 檔案中設定選擇的快取驅動:
CACHE_DRIVER=file
File: 預設快取驅動,將快取儲存在檔案中。Database: 將快取儲存在資料庫表中。Redis: 將快取儲存在 Redis 中。Memcached: 使用 Memcached 作為快取儲存。配置資料庫快取驅動
php artisan cache:table
php artisan migrate
.env 檔案中設定快取驅動:
CACHE_DRIVER=database
儲存快取
use Illuminate\Support\Facades\Cache;
// 儲存一個簡單的值
Cache::put('key', 'value', now()->addMinutes(10));
// 儲存一個值,如果鍵不存在則設定
Cache::add('key', 'value', now()->addMinutes(10));
取得快取
$value = Cache::get('key');
// 如果鍵不存在,可以提供一個預設值
$value = Cache::get('key', 'default');
刪除快取
Cache::forget('key');
使用快取標籤(可選)
在支援標籤的快取驅動(如 Redis 和 Memcached )中,可以使用快取標籤來組織和管理快取:
Cache::tags(['people', 'authors'])->put('John', $john, now()->addMinutes(10));
$john = Cache::tags(['people', 'authors'])->get('John');
使用範例說明
假設有一個需要頻繁查詢的資料庫數據,可以使用快取來提高效能:
首先使用 remember 方法會先檢查快取是否存在鍵 posts.all 的數據,如果存在則直接傳回快取的資料;如果不存在,則執行回呼函數(查詢資料庫),並將結果儲存到快取中。
use Illuminate\Support\Facades\Cache;
use App\Models\Post;
public function getPosts()
{
    $posts = Cache::remember('posts.all', now()->addMinutes(30), function () {
        return Post::all();
    });
    return $posts;
}
緩存用戶的資料,目標減少對資料庫的頻繁請求
參考文章:
跟著官方文件學習Laravel, 並實作出一個會員登入系統 - Day28 跟著官方文件學習Laravel-cache
Laravel 9 漫遊,享受魔法般的極速網頁開發體驗 - Day 24:Laravel 9 對快取的操作
step 1:設置緩存配置
在 .env 文件中配置了緩存驅動
DB_CONNECTION=sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
CACHE_DRIVER=file
step 2:創建一個控制器來處理緩存邏輯
下指令 php artisan make:controller UserController,在app/Http/Controllers/UserController.php 寫入緩存用戶資料的邏輯
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Support\Facades\Cache;
use \Illuminate\Http\JsonResponse;
class UserController extends Controller
{
    /**
     * 取得用戶資料
     * 
     * @param User $user
     * @return JsonResponse
     */
    public function getUser(User $user): JsonResponse
    {
        // 使用 Cache::remember 方法,緩存用戶資料(緩存的鍵名, 緩存的有效期min, 匿名函數)
        $user = Cache::remember("user_{$user->id}", 60, function () use ($user) {
            // 如果緩存不存在,從資料庫中檢索用戶資料
            return $user;
        });
        return response()->json($user);
    }
    /**
     * 清除緩存
     * 
     * @param User $user
     * @return JsonResponse
     */
    public function clearCache(User $user): JsonResponse
    {
        Cache::forget("user_{$user->id}");
        return response()->json(['message' => 'Cache cleared!']);
    }
}
step 3:設置路由
use App\Http\Controllers\UserController;
Route::get('/user/{id}', [UserController::class, 'getUser']);
Route::delete('/user/{id}/cache', [UserController::class, 'clearCache']);
step 4:建立資料庫
下指令 php artisan migrate
step 5:Test
case 1 - 獲取用戶資料並緩存:
發送 GET 請求到 /user/{id},這會檢查緩存是否存在 -> 如果存在,直接返回;如果不存在,從資料庫中檢索用戶資料並緩存。
case 2 - 清除緩存:
發送 DELETE 請求到 /user/{id}/cache,清除對應用戶的緩存。